<?php

//namespace app\common\lib;
/**
 * https://www.runoob.com/ollama/ollama-api.html
 * Ollama API 客户端 (兼容 PHP 5.4)
 * 使用示例见底部
 */
class OllamaClient {
    private $api_base = 'http://192.168.1.3:11434/api';

    /**
     * @param string $api_base  Ollama API 地址 (默认 http://localhost:11434/api)
     */
    public function __construct($api_base = '') {
        if (!empty($api_base)) {
            $this->api_base = rtrim($api_base, '/');
        }
    }

    /**
     * 生成文本
     * @param array $params 请求参数
     *   - model (string) 必填: 模型名称 (如 "llama3.1")
     *   - prompt (string) 必填: 输入提示
     *   - options (array): 高级参数 (如温度、max_tokens等)
     *   - stream (bool): 是否流式响应 (默认 false)
     * @return array|bool 成功返回解析后的JSON数组，失败返回false
     */
    public function generate($params) {
        return $this->_callApi('/generate', $params);
    }

    /**
     * 聊天交互
     * @param array $params 请求参数
     *   - model (string) 必填: 模型名称
     *   - messages (array) 必填: 消息历史 (格式见示例)
     *   - stream (bool): 是否流式响应
     * @return array|bool
     */
    public function chat($params) {
        return $this->_callApi('/chat', $params);
    }
    public function embed($params) {
        return $this->_callApi('/embed', $params);
    }

    /**
     * 列出可用模型
     * @return array|bool
     */
    public function listModels() {
        $response = $this->_callApi('/tags', array(), 'GET');
        return isset($response['models']) ? $response['models'] : false;
    }

    /**
     * 调用API核心方法
     */
    private function _callApi($endpoint, $data = array(), $method = 'POST') {
        $url = $this->api_base . $endpoint;
        
        // 兼容PHP 5.4的cURL初始化
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);

        if ($method === 'POST') {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
        }

        // 处理流式响应
        if (isset($data['stream']) && $data['stream']) {
            $response = '';
            curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) use (&$response) {
                $response .= $data;
                return strlen($data);
            });
        }

        $result = curl_exec($ch);
        $error = curl_error($ch);
        curl_close($ch);

        if ($error) {
            trigger_error("Ollama API Error: " . $error, E_USER_WARNING);
            return false;
        }

        // 解析JSON响应
        $decoded = json_decode($result, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            trigger_error("Ollama JSON解析失败: " . json_last_error_msg(), E_USER_WARNING);
            return false;
        }

        return $decoded;
    }
}

/*****************************
 * 使用示例
 *****************************/

// 初始化客户端
/*$ollama = new OllamaClient(); // 默认连接本地11434端口

// 示例1: 生成文本
$response = $ollama->generate(array(
    'model' => 'llama3.1',
    'prompt' => 'PHP是最好的语言吗？',
    'stream' => false
));
if ($response && isset($response['response'])) {
    echo "答案: " . $response['response'];
}

// 示例2: 聊天交互
$history = array(
    array('role' => 'user', 'content' => '你好'),
    array('role' => 'assistant', 'content' => '您好！有什么可以帮助您？')
);
$response = $ollama->chat(array(
    'model' => 'llama3.1',
    'messages' => $history
));
if ($response && isset($response['message']['content'])) {
    echo "AI回复: " . $response['message']['content'];
}

// 示例3: 获取模型列表
$models = $ollama->listModels();
if ($models) {
    echo "可用模型: " . implode(', ', array_map(function($m) { return $m['name']; }, $models));
}*/